/**
 * @file:          Debug.h
 * @brief:
 * @details:
 * @author:        wjh
 * @date created:  2023.06.10
 * @version:       1.0.0
 * @par copyright (c):
 *
 * @par history (desc):
 *   version:1.0.0, wjh, 2023.06.10,01:43:58
 */
#ifndef _DEBUG_H_
#define _DEBUG_H_

/* Include Files **************************************************************/
#include "stdio.h"
#include "Datatype.h"
#include "string.h"

/* Macro Definition ***********************************************************/
#define UART_TX_BUFF_SIZE 100
#define FLOAT2STR_CHANNEL_SIZE 4

/* Variable Declare ***********************************************************/
extern char DebugIndex;
extern char DebugBuff[1][UART_TX_BUFF_SIZE];
extern uint16_t DebugBuff_Len;
extern char DebugNewDataBuff[UART_TX_BUFF_SIZE];
extern uint16_t DebugNewDataBuff_Len;
extern char DebugTmpBuff[UART_TX_BUFF_SIZE];
extern uint16 DebugBaseIndex;

/* Macro Function ***********************************************************/
#ifdef DEBUG_PRINT

/* DBprintf() */
#define DBprintf(...) printf(__VA_ARGS__)
// #define DBprintf(...) fprintf(stderr, __VA_ARGS__)

/* DBprintfDMA_Add() */
#ifndef HARDWARE_DISABLE

// #define DBprintfDMA_AddStr(...)                                                       \
//     if (strlen(DebugBuff[DebugIndex]) + strlen(__VA_ARGS__) <= UART_TX_BUFF_SIZE - 1) \
//     {                                                                                 \
//         strcat(DebugBuff[DebugIndex], __VA_ARGS__);                                   \
//     }
// #define DBprintfDMA_Add(...)            \
//     sprintf(DebugTmpBuff, __VA_ARGS__); \
//     DBprintfDMA_AddStr(DebugTmpBuff)
// #define DBprintfDMAAdv_AddStr(...)                                             \
//     {                                                                          \
//         uint16_t len = strlen(__VA_ARGS__);                                    \
//         if (DebugNewDataBuff_Len + len <= UART_TX_BUFF_SIZE - 1)               \
//         {                                                                      \
//             memcpy(&DebugNewDataBuff[DebugNewDataBuff_Len], __VA_ARGS__, len); \
//             DebugNewDataBuff_Len += len;                                       \
//         }                                                                      \
//     }
//     if (strlen(DebugNewDataBuff) + strlen(__VA_ARGS__) <= UART_TX_BUFF_SIZE - 1) \
    // {                                                                            \
    //     strcat(DebugNewDataBuff, __VA_ARGS__);                                   \
    // }
// #define DBprintfDMAAdv_AddStr_N(str, n)                          \
//     if (DebugNewDataBuff_Len + n <= UART_TX_BUFF_SIZE - 1)       \
//     {                                                            \
//         memcpy(&DebugNewDataBuff[DebugNewDataBuff_Len], str, n); \
//         DebugNewDataBuff_Len += n;                               \
//     }
// if (strlen(DebugNewDataBuff) + n <= UART_TX_BUFF_SIZE - 1)
// {
//     strncat(DebugNewDataBuff, str, n);
// }
#define DBprintfDMAAdv_Add(...)         \
    sprintf(DebugTmpBuff, __VA_ARGS__); \
    DBprintfDMAAdv_AddStr(DebugTmpBuff)

#else
// #define DBprintfDMA_AddStr(...) printf(__VA_ARGS__)
// #define DBprintfDMAAdv_AddStr(...) printf(__VA_ARGS__)
// #define DBprintfDMAAdv_AddStr_N(str, n)
// #define DBprintfDMA_Add(...) printf(__VA_ARGS__)
#define DBprintfDMAAdv_Add(...) printf(__VA_ARGS__)
#endif

#else
#define DBprintf(...)
// #define DBprintfDMA_AddStr(...)
// #define DBprintfDMAAdv_AddStr(...)
// #define DBprintfDMAAdv_AddStr_N(str, n)
// #define DBprintfDMA_Add(...)
#define DBprintfDMAAdv_Add(...)
#endif

/*
// #define ERROR(...) \
// do{ \
//     fprintf(stderr, "[ERROR  ][%s %s]��\"%s\": %s(Line %d): ", __DATE__, __TIME__, __FILE__, __FUNCTION__, __LINE__); \
//     fprintf(stderr, __VA_ARGS__); \
// }while(0)

// #define WARNING(...) \
// do{ \
//     fprintf(stdout, "[WARNING][%s %s]��\"%s\": %s(Line %d): ", __DATE__, __TIME__, __FILE__, __FUNCTION__, __LINE__); \
//     fprintf(stdout, __VA_ARGS__); \
// }while(0)

// #define INFO(...) \
// do{ \
//     fprintf(stdout, "[INFO   ][%s %s]��\"%s\": %s(Line %d): ", __DATE__, __TIME__, __FILE__, __FUNCTION__, __LINE__); \
//     fprintf(stdout, __VA_ARGS__); \
// }while(0)
*/

/* Inline Function Define *****************************************************/

/* Function Declare ***********************************************************/
void DBprintfDMA_Send();
void DBprintfDMAAdv_Send();
void DBprintfDMAAdv_AddStr(char *str);
void DBprintfDMAAdv_AddStr_N(char *str, uint16_t n);
void HexAddByte(uint8_t byte);
void HexAddArray(uint8_t *data, uint8_t len);
char *float2str(float data_float, uint16_t disp_bits);

#endif
